home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 041-050 / amok45 / crypto / tauscher.mod < prev    next >
Text File  |  1993-11-04  |  4KB  |  197 lines

  1. (*-----------------------------------------------------------------------------
  2.   :Program.     Tauscher
  3.   :Contents.    kodiert eine Beliebige Datei durch Vertauschen der Bytes.
  4.   :Author.      Klemens Meyer
  5.   :Address.     Sievershauser Str.3 3155 Edemissen/Oelerse
  6.   :History.     V 1.0 19.06.89 [Meyer]
  7.   :Copyright.   Public Domain
  8.   :Language.    MODULA 2
  9.   :Translator.  M2Amiga V3.2d A+L
  10.   :Usage.       vom CLI: Tauscher <FILE> <CODE>
  11. -----------------------------------------------------------------------------*)
  12. MODULE Tauscher;
  13.  
  14. FROM SYSTEM IMPORT
  15.   ADR;
  16.  
  17. FROM Arts IMPORT
  18.   TermProcedure,Terminate;
  19.  
  20. FROM FileSystem IMPORT
  21.   File,Response,
  22.   Lookup,Close,
  23.   ReadBytes,WriteBytes;
  24.  
  25. FROM Arguments IMPORT
  26.   NumArgs,GetArg;
  27.  
  28. FROM InOut IMPORT
  29.   WriteString,WriteLn;
  30.  
  31. FROM Str IMPORT
  32.   Compare,Concat,Length;
  33.  
  34.  
  35.  
  36.  
  37. TYPE String     = ARRAY [0..80] OF CHAR;
  38.      Block      = ARRAY [0..10] OF CHAR;
  39.      tProc      = PROCEDURE (VAR Block,String);
  40.  
  41.  
  42. VAR rfile,wfile         : File;
  43.     code                : String;
  44.     block               : Block;
  45.     Tausch              : tProc;
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53. PROCEDURE Swap (VAR x,y : CHAR);
  54. (* :Input.      zwei CHAR-Variable
  55.    :Semantic.   Vertauscht die Inhalte beider Variablen. *)
  56. VAR d   : CHAR;
  57. BEGIN
  58.   d:=x;x:=y;y:=d;
  59. END Swap;
  60.  
  61.  
  62.  
  63. PROCEDURE Hin (VAR b : Block;c : String);
  64. (* :Input.      ein 10 Zeichen langes Array aus der Klartextdatei
  65.    :Input.      Codewort max. 80 Zeichen lang
  66.    :Semantic.   Vertauscht die Bytes des Blocks b untereinander *)
  67. VAR d           : CHAR;
  68.     i,l,x,y     : INTEGER;
  69. BEGIN
  70.   l:=Length(c);
  71.   l:=l-(l MOD 2);
  72.   FOR i:=0 TO l BY 2 DO
  73.     x:=INTEGER(c[i]) MOD 10;
  74.     y:=INTEGER(c[i+1]) MOD 10;
  75.     Swap(b[x],b[y]);
  76.   END; (* FOR *)
  77. END Hin;
  78.  
  79.  
  80. PROCEDURE Her (VAR b : Block;c : String);
  81. (* :Input.      siehe Hin
  82.    :Semantic.   macht die Vertauschung aus Procedure Hin rückgängig *)
  83. VAR d           : CHAR;
  84.     i,l,x,y     : INTEGER;
  85. BEGIN
  86.   l:=Length(c);
  87.   l:=l-(l MOD 2);
  88.   FOR i:=l TO 0 BY -2 DO
  89.     x:=INTEGER(c[i+1]) MOD 10;
  90.     y:=INTEGER(c[i]) MOD 10;
  91.     Swap(b[x],b[y]);
  92.   END; (* FOR *)
  93. END Her;
  94.  
  95.  
  96. PROCEDURE CloseAll;
  97. (* :Semantic.   Abschlußprocedure. Schließt die geöffneten Files *)
  98. BEGIN
  99.   Close(rfile);
  100.   Close(wfile);
  101. END CloseAll;
  102.  
  103.  
  104. PROCEDURE Extension (VAR str,ext : String);
  105. (* :Input.      String mit Filenamen und leerer String für Extension
  106.    :Semantic.   ermittelt alle zeichen nach dem letzten Punkt im Filnamen *)
  107. VAR i,j : LONGCARD;
  108. BEGIN
  109.   i:=Length(str);
  110.   WHILE (str[i]#".") AND (i>0) DO
  111.     DEC(i);
  112.   END; (* WHILE *)
  113.   FOR j:=0 TO Length(str)-i DO
  114.     ext[j]:=str[j+i];
  115.   END; (* FOR *)
  116.   str[i]:=CHR(0);
  117. END Extension;
  118.  
  119.  
  120.  
  121.  
  122. PROCEDURE Init;
  123. (* :Semantic.   öffnet alle Dateien und weist die Entschlüsselugs-
  124.    :Semantic.   procedure zu, wenn die Extension des Files ".code" lautet.
  125.    :Semantic.   Sonst die Verschlüsselungsprocedure *)
  126. VAR fname,ext   : String;
  127.     len         : INTEGER;
  128. BEGIN
  129.   IF NumArgs()#2 THEN
  130.     WriteString("Usage: Tauscher <FILE> <CODE>");WriteLn;
  131.     Terminate(0);
  132.   END; (* IF *)
  133.   TermProcedure(CloseAll);
  134.   GetArg(1,fname,len);
  135.   WriteString("Klartextfile: ");WriteString(fname);
  136.   Lookup(rfile,fname,4096,FALSE);
  137.   IF rfile.res#done THEN
  138.     WriteString(" konnte nicht geöffnet werden!");WriteLn;
  139.     Terminate(0);
  140.   END; (* IF *)
  141.   WriteLn;
  142.   Extension(fname,ext);
  143.   IF Compare(ext,".code")=0 THEN
  144.     Tausch:=Her;
  145.   ELSE
  146.     Tausch:=Hin;
  147.     Concat (fname,ext);
  148.     Concat (fname,".code");
  149.   END; (* IF *)
  150.   WriteString("Codefile: ");
  151.   WriteString(fname);
  152.   Lookup(wfile,fname,4096,TRUE);
  153.   IF wfile.res#done THEN
  154.     WriteString(" konnte nicht geöffnet werden!");WriteLn;
  155.     Terminate(0);
  156.   END; (* IF *)
  157.   WriteLn;
  158.   GetArg (2,code,len);
  159. END Init;
  160.  
  161.  
  162. PROCEDURE ReadBlock (VAR b : Block);
  163. (* :Semantic.   Liest einen 10-Zeichen langen Block in b ein *)
  164. VAR act,i       : LONGINT;
  165. BEGIN
  166.   ReadBytes(rfile,ADR(b),10,act);
  167.   IF act<10 THEN
  168.     FOR i:=act TO 9 DO
  169.       b[i]:=CHR(32);
  170.     END; (* FOR *)
  171.   END; (* IF *)
  172.   b[10]:=CHR(0);
  173. END ReadBlock;
  174.  
  175. PROCEDURE WriteBlock (VAR b : Block);
  176. (* :Semantic.   schreibt einen 10 Zeichen langen Block aus b *)
  177. VAR act : LONGINT;
  178. BEGIN
  179.   WriteBytes(wfile,ADR(b),10,act);
  180. END WriteBlock;
  181.  
  182.  
  183.  
  184. BEGIN (* MAIN *)
  185.   Init;
  186.   LOOP
  187.     ReadBlock (block);
  188.     IF rfile.eof THEN EXIT END;
  189.     Tausch (block,code);
  190.     WriteString (block);
  191.     WriteBlock (block);
  192.   END; (* LOOP *)
  193.   WriteLn;
  194.   WriteString ("Tausch beendet!");WriteLn;
  195. END Tauscher.
  196.  
  197.